/**
 @description 用于打开文件选择器，返回一个promise
 @author jzyong(沈健汉)
 @date 2020-10-29
 */
(function (global, factory) {
    typeof exports === 'object' && typeof module !== 'undefined' ?
        module.exports = factory() :
        typeof define === 'function' && define.amd ? define(factory) :
            (global = global || self, global.openFile = factory());

})(this, function () {

    // 如果当前花环境不支持promise，手动实现一个promise，垃圾ie
    if (!window.Promise) {
        window.Promise = function (callback) {
            // 在then里面执行的方法
            var thenFun = undefined

            // 在catch里面执行的方法
            var catchFun = undefined

            // 模拟then方法
            this.then = function (fun) {
                // console.log(1)
                thenFun = fun
                return this
            }
            // 模拟catch方法
            this.catch = function (fun) {
                catchFun = fun
                return this
            }

            // 传入回调函数的resolve方法
            this.resolve = function (data) {
                typeof thenFun === 'function' ? thenFun(data) : ''
            }

            // 传入回调函数的reject方法
            this.reject = function () {
                typeof catchFun === 'function' ? catchFun(data) : ''
            }

            // 定时器为了兼容ie，
            setTimeout(function () {
                callback(this.resolve, this.reject)
            }.bind(this), 10)
        }
    }

    /**
     * @param accept 指定文件类型
     * @param 回调函数，在不支持promise的浏览器下非常有用
     * @return Promist（支持promise的情况下）
     */
    return function (accept) {
        var createDom = function () {
            var dom = document.createElement('input')
            dom.type = 'file'
            dom.accept = accept || ''
            dom.style.display = 'none'
            return dom
        }

        var appenDomToBody = function (dom) {
            document.body.appendChild(dom)
            dom.click()
        }

        // 创建dom
        var dom = createDom()

        return new Promise(function (resolve) {
            dom.onchange = function (e) {
                if (e.currentTarget.files[0]) {
                    resolve(e.currentTarget.files[0])
                } else {
                    resolve(false)
                }

                dom.remove ? dom.remove() : document.body.removeChild(dom)
            }
            appenDomToBody(dom)
        })
    }
})
